package main

import (
	"fmt"
	"strconv"
)

// isDay 大日期 13578 10 12
// 小日期 469 11
// 特殊日期 2
// isDay 判断日期是否存在数组中
func isDay(items []int, month int, days int) (int, bool) {
	isEx := false
	for _, eachItem := range items {
		if eachItem == month {
			isEx = true
		}
	}
	if days <= 30 && isEx { //日期最大30
		return 30, true
	} else if days > 30 && isEx {
		return 31, true
	} else {
		return 0, false
	}
}

// isRightDate 判断传入的值是否为日期的数值
func isRightDate(keys string) (int, bool) {
	key, errKeys := strconv.Atoi(keys)
	if errKeys != nil {
		return 0, false
	} else {
		return key, true
	}
}

// isFeb 判断传进来的是不是2月
func isFeb(month int) bool {
	if month == 2 {
		return true
	} else {
		return false
	}
}

// assembly 函数总体
func assembly(isYear bool, isMonth bool, isDays bool, year int, month int, day int, bigDay []int, smallDay []int) bool {
	if isYear && isMonth && isDays {
		if month >= 1 && month <= 12 {
			if day <= 31 && day >= 1 {
				if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
					//润年
					if isFeb(2) {
						if day <= 29 {
							fmt.Printf("%v 年 %v 月 %v 日", year, month, day)
							return true
						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					} else {
						date, isExist := isDay(bigDay, month, day)
						if (isExist && date == 31) || (isExist && date == 30) {
							fmt.Printf("%v 年 %v 月 %v 日", year, month, day)
							return true

						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					}
				} else {
					//平年
					if isFeb(2) {
						if day <= 28 {
							fmt.Printf("%v 年 %v 月 %v 日", year, month, day)
							return true
						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					} else {
						date, isExist := isDay(smallDay, month, day)
						if (isExist && date == 31) || (isExist && date == 30) {
							fmt.Printf("%v 年 %v 月 %v 日", year, month, day)
							return true

						} else {
							fmt.Println("输入的日期错误，请重新输入")
							return false
						}
					}
				}
			} else {
				fmt.Println("输入的日期错误，请重新输入")
				return false
			}
		} else {
			fmt.Println("输入的月份错误，请重新输入")
			return false
		}
	} else {
		fmt.Println("输入有错误，请重新输入")
		return false
	}
}
func main() {
	//循环打印输入的月份的天数
	//要判断输入的月份是否错误
	var yearStr string
	var monthStr string
	var dayStr string
	bigDay := []int{1, 3, 5, 7, 8, 10, 12}
	smallDay := []int{4, 6, 9, 11, 8, 10, 12}
	for {
		//输入年份
		fmt.Printf("请输入年份：")
		fmt.Scanln(&yearStr)
		fmt.Printf("请输入月份：")
		fmt.Scanln(&monthStr)
		fmt.Printf("请输入日期：")
		fmt.Scanln(&dayStr)
		year, isYear := isRightDate(yearStr)
		month, isMonth := isRightDate(monthStr)
		day, isDays := isRightDate(dayStr)
		if assembly(isYear, isMonth, isDays, year, month, day, bigDay, smallDay) {
			break
		} else {
			continue
		}
		// 判断所有格式是否正确

	}
}
